package fr.demos.cinepantin.dao.impl;

import java.util.List;

import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.transaction.UserTransaction;

import fr.demos.cinepantin.Article;
import fr.demos.cinepantin.Livre;
import fr.demos.cinepantin.dao.DaoLivre;
import fr.demos.cinepantin.dao.interfac.LivreDao;
import fr.demos.cinepantin.exception.DaoExceptions;

@DaoLivre
public class LivreDaoImpl implements LivreDao {
	// Grace a l'injection l'objet entityManager est instancie
	@PersistenceContext(unitName = "cinemarc")
	private EntityManager em; // gestion des entity qui sont dans un contexte
	@Resource
	private UserTransaction ut;

	@Override
	public List<Livre> getAllLivre() throws DaoExceptions {
		
		Livre livre = null;
		String query = "select l from Livre l ";
		TypedQuery<Livre> q = em.createQuery(query, Livre.class);
		List<Livre> resLivre = q.getResultList();

		return resLivre;

	}
		// TODO Auto-generated method stub
		
	

	@Override
	public Livre getLivreById(int id) throws DaoExceptions {
		
		Livre livre = null;
		livre = em.find(Livre.class, id);

		return livre;
		
	}

	@Override
	public List<Livre> getLivreByTitre(String titre) throws DaoExceptions {
		
		String query = "SELECT l FROM Livre l WHERE";
		query += " titre LIKE '%" + titre + "%'";
		TypedQuery<Livre> q = em.createQuery(query, Livre.class);
		List<Livre> resLivre = q.getResultList();
		return resLivre;

		
	}

	@Override
	public List<Livre> getLivreByAuteur(String auteur) throws DaoExceptions {
		String query = "select l from Livre l where l.auteur like ?1";
		TypedQuery<Livre> q = em.createQuery(query, Livre.class);
		q.setParameter(1, "%" + auteur + "%");

		List<Livre> resLivre = q.getResultList();

		return resLivre;
	
	}

	@Override
	public void addLivre(Livre l) throws DaoExceptions {
		
		try {
			ut.begin();
		} catch (Exception e) {
			e.printStackTrace();
		}

		em.persist(l);

		try {
			ut.commit();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new DaoExceptions(e.getMessage(), e);
		}
	}
		// TODO Auto-generated method stub



	@Override
	public List<Livre> getLivreByArticleId(int idArticle) throws DaoExceptions {
		// TODO Auto-generated method stub
		return null;
	}



	@Override
	public void modifierLivre(Livre l) throws DaoExceptions {
		try {
			ut.begin();
		} catch (Exception e) {
			e.printStackTrace();
		}

		em.merge(l);

		try {
			ut.commit();
		} catch (Exception e) {
			e.printStackTrace();
			throw new DaoExceptions(e.getMessage(), e);
		}		
	}
		
	}


